﻿using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace YouDaoNotesCodes
{
    class XmlCreate
    {
        #region 创建xml方式1：层层赋值
        public void XmlCreate1()
        {
            //方式1
            XDocument doc = new XDocument(new XDeclaration("1.0", "utf-16", null));//注意此处加xml头doc.Declaration.ToString()
            XElement p1 = new XElement("Persons");
            p1.Add(new XAttribute("xr1", "属性1"));
            p1.Add(new XAttribute("x2", "属性2"));//属性性质
            p1.Add(new XElement("name", "tom"));//节点性质
            p1.Add(new XElement("name1", "tom1"));//节点性质

            XElement p2 = new XElement("Person");
            p2.Add(new XElement("name", "jerry"));
            p2.Add(new XElement("name1", "jerry1"));
            //层层赋值
            p1.Add(p2);
            doc.Add(p1);

            Console.WriteLine("方式1");
            Console.Write(doc.Declaration.ToString() + "\n" + doc.ToString() + "\n");

        }
        #endregion

        #region 创建xml方式2：阶梯状，很有层次感
        public void XmlCreate2()
        {
            //方式2
            XDocument indoc = new XDocument(new XDeclaration("1.0", "utf-16", null),
                new XElement("Persons",
                    new XAttribute("xr1", "属性1"),
                    new XAttribute("xr2", "属性2"),
                    new XElement("name", "tom"),
                    new XElement("name1", "tom1"),
                    new XElement("Person",
                        new XElement("name", "jerry"),
                        new XElement("name1", "jerry1")
                        )));
            Console.WriteLine("方式2");
            Console.Write(indoc.Declaration.ToString() + "\n" + indoc.ToString() + "\n");
            Console.ReadKey();
        }
        #endregion

        #region 创建XML方式3：方式1展开
        public void XmlCreate3()
        {
            XDocument xDoc = new XDocument(new XDeclaration("1.0", "utf-16", null));  //实例化一个xml(内容)文档
            XElement xRoot = new XElement("Root");  //创建一个xml根节点
            xDoc.Add(xRoot);  //把根节点添加到xml文档  记住：一个xml文档只能有一个根节点，可以多个父节点。多个子节点，可以把任何一个元素作为父节点或子节点

            XElement xFlyInfo = new XElement("FlyInfo", new XAttribute("desc", "FlyInfo"));  //
            XElement xAirLine = new XElement("AirLine");
            XElement xSeat = new XElement("Seat");
            XElement xRating = new XElement("Rating");
            XElement xGai = new XElement("Gai");
            XElement xTui = new XElement("Tui");
            XElement xQian = new XElement("Qian");

            xFlyInfo.Value = "航空信息";
            xAirLine.Value = "航空";
            xSeat.Value = "经济舱";
            xRating.Value = "A";
            xGai.Value = "可以改";
            xTui.Value = "可以退";
            xQian.Value = "可以签";

            //以上先定义后赋值很没有必要，冗余度很大。直接按照如下所写：定义+赋值
            // XElement xAirLine = new XElement("AirLine","中国南方航空"); 


            xFlyInfo.Add(xAirLine, xSeat, xRating, xGai, xTui, xQian);  //把元素添加到父级节点中
            xRoot.Add(xFlyInfo);//最后是根节点

            //xDoc.Save("test.xml"); //保存xml文档
            Console.Write(xDoc.Declaration.ToString() + "\n" + xDoc.ToString() + "\n");
            Console.ReadKey();
        }
        #endregion

        #region 创建xml方式4：DataSet形式
        public void XmlCreateWithDataSet()
        {
            DataSet ds = new DataSet("Root"); //实例化一个DataSet 并初始化值为Root，映射到xml时则是根节点，当没初始化值时。默认是NewDataSet  

            DataTable table = new DataTable("FlyInfo"); //实例化一个table。同时取名为FlyInfo。当映射到xml文档时则是xml文档中的一个父节点,table必须指定表名，因为它可没有默认值。
            //table.TableName = "FlyInfo";  //如果初始化没设置表名，可以通过属性设置。也OK

            //给Table添加列，映射到xml文档时是当前父节点的子节点
            table.Columns.Add("AirLine");
            table.Columns.Add("Seat");
            table.Columns.Add("Rating");
            table.Columns.Add("Gai");
            table.Columns.Add("Tui");
            table.Columns.Add("Qian");

            //创建与该表具有相同架构的新行
            DataRow dr = table.NewRow();

            //添加数据
            dr["AirLine"] = "航空";
            dr["Seat"] = "经济舱";
            dr["Rating"] = "A";
            dr["Gai"] = "可以改";
            dr["Tui"] = "可以退";
            dr["Qian"] = "可以签";

            table.Rows.Add(dr); //把每一行添加到table

            //以下两句效果相同
            ds.Tables.Add(table); //把table添加到DataSet(数据集)中
            //ds.Tables.Add(table.Copy()); //这样也行，复制当前表格的数据和结构，然后添加到DataSet中

            ds.WriteXml("tableDemo.xml");  //保存咯

            //下面都是清除数据，释放资源 
            //dt.Rows[0].Delete(); 删除某一行
            //dt.AcceptChanges(); 返回删除后的数据
            ds.Clear();
            ds.Tables.Clear();
        }
        #endregion

        #region 创建xml方式5：直接创建
        public void XmlCreate5()
        {
            //方式3：解析xml常用
            XmlDocument xdoc = new XmlDocument();
            xdoc.Load("../xml/user.xml");//路径bin/xml/user.xml
            xdoc.LoadXml("写上xml");
        }
        #endregion

        #region  soapUI请求xml组织
        //特殊-含有命名空间的xml
        public static void WithNamespaceXml()
        {
            //① XDocument方式
            //创建含有多个命名空间的Xml文档 ，示例为soapui请求的xml组织 
            XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
            XNamespace web = "http://webservice.saas.fp.bwdz.com/";

            XDocument inDoc = new XDocument(new XDeclaration("1.0", "utf-16", null),
                new XElement(soapenv + "Envelope",
                    new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
                    new XAttribute(XNamespace.Xmlns + "web", web),
                    new XElement(soapenv + "Header",
                        new XElement(soapenv + "Body",
                            new XElement(web + "checkMap",
                                new XElement("fpXml"))))));


            Console.WriteLine(inDoc.ToString());

            //② XmlDocument方式
            //创建含有多个命名空间的Xml文档    
            XmlDocument doc = new XmlDocument();
            doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><root></root>");
            XmlElement ele = doc.CreateElement("bbs", "hit", "urn:bbs");
            ele.InnerText = "100";
            doc.DocumentElement.AppendChild(ele);
            doc.Save("test1.xml");

            Console.WriteLine(doc.InnerXml);

            //
        }
        #endregion

    }
}
